Tổng quan B-cây

Trong B-cây, các nút trong (nút không là lá) có thể có số lượng nút con khác nhau, giới hạn trong một khoảng nhất định. Khi dữ liệu được chèn vào hoặc xóa đi từ một nút, số nút con của nó thay đổi. Khi đó, để duy trì số nút con trong khoảng đã định, các nút trong có thể được hợp hai làm một hoặc chia đôi. Vì số lượng nút con có thể nằm trong một khoảng lớn, B-cây không cần tái cân bằng thường xuyên như cây nhị phân tìm kiếm, nhưng lại sử dụng bộ nhớ lãng phí hơn do các nút không chứa tối đa dữ liệu.

Khi sử dụng B-cây, ta định trước một số nguyên t. Mỗi nút trong của B-cây (trừ nút gốc) có từ t-1 tới 2t-1 khóa. Hệ số 2 đảm bảo rằng các nút có thể được chia đôi hoặc kết hợp. Với một nút trong có 2t-1 khóa, ta có thể lấy khóa giữa trong 2t-1 khóa chèn vào nút cha và chia 2t-2 khóa còn lại vào hai nút mới, mỗi nút t-1 khóa. Tương tự như vậy, khi một nút và nút kế bên đều có t-1 khóa, ta có thể kết hợp hai nút cùng với một khóa từ nút cha thành một nút mới có 2t-1 khóa.

Số lượng nút con của một nút đúng bằng số khóa của nút đó cộng một. Vì vậy, số lượng nút con của một nút trong là từ t tới 2t.

B-cây duy trì tính cân bằng bằng cách đảm bảo các nút lá đều có cùng độ sâu. Chiều cao của cây tăng dần dần khi các nút mới được chèn vào cây, nhưng con số này thay đổi rất chậm. Khi chiều cao của cây tăng lên, độ sâu của tất cả các nút lá tăng lên cùng một lúc.

B-cây có lợi thế hơn các cấu trúc dữ liệu tìm kiếm khác khi thời gian truy cập lớn hơn nhiều lần thời gian đọc dữ liệu liên tiếp nhau. Điều này thường xảy ra khi các nút được lưu trên bộ nhớ ngoài. Bằng cách tăng số lượng nút con của mỗi nút, chiều cao của cây giảm xuống và số lần truy cập cũng giảm. Thêm vào đó, số thao tác tái cân bằng cây cũng giảm đi. Thông thường, tham số t (quyết định số khóa của mỗi nút) được chọn tùy theo lượng thông tin trong mỗi khóa và kích thước mỗi khối đĩa.

Các biến thể

Thuật ngữ B-cây có thể được dùng để chỉ một thiết kế cụ thể, cũng có thể được dùng để chỉ một lớp các thiết kế. Theo nghĩa hẹp, B-cây lưu một số khóa ở các nút trong và không lưu bản sao của các khóa đó ở nút lá. Theo nghĩa rộng, nó còn bao gồm những biến thể khác như B+-cây hay B*-cây.

  • Trong B+-cây, các nút trong lưu bản sao của khóa. Tất cả các khóa, cùng với dữ liệu đi kèm được lưu ở các nút lá. Ngoài ra các nút lá còn có con trỏ đến các nút lá kế bên để tăng tốc truy cập tuần tự.
  • B*-cây thực hiện nhiều thao tác tái cân bằng hơn để lưu trữ dự liệu dày đặc hơn. Mỗi nút trong khác gốc phải đầy tới hai phần ba thay vì chỉ một nửa như trong B-cây.